package progen.kernel.grammar.validations;

import progen.kernel.grammar.Grammar;
import progen.kernel.grammar.GrammarNotValidException;

/**
 * Clase que encadena y comprueba las distintas comprobaciones que se realizan
 * para comprobar que una gramática está bien formada y puede generar árboles
 * evaluables en la aplicación.
 * 
 * @author jirsis
 * @since 2.0
 * @see progen.kernel.grammar.validations
 */
public class GrammarCheck {
    /** La gramática a comprobar. **/
    private Grammar grammar;

    /**
     * Constructor genérico de la clase que recibe como parámetro la gramática a
     * comprobar.
     * 
     * @param grammar
     *            La gramática a comprobar.
     */
    public GrammarCheck(Grammar grammar) {
	this.grammar = grammar;
    }

    /**
     * Método que realiza todas las validaciones necesarias sobre la gramática.
     * En caso de que no sea correcta, se lanzará una excepción de tipo
     * GrammarNotValidException
     * @throws GrammarNotValidException Excepción lanzada si no cumple con las 
     * validaciones definidas.
     * @see GrammarNotValidException
     * 
     */
    public void validate() throws GrammarNotValidException{
	new GrammarNonTerminalSymbolProduction().validate(grammar);
	new InaccesibleProductions().validate(grammar);
	new SuperfluousProductions().validate(grammar);
    }

}
